/**
 * @file QWF_Ctrl.c
 * @brief QWF框架遥控器控制核心模块（处理不同遥控器输入，转换为统一控制指令并映射到执行机构）
 * @details 支持VT13、DT7等多类型遥控器，兼容RC（遥控器摇杆）和KM（键鼠）两种控制模式；
 *          通过条件编译区分底盘（Circuit_Boards!=Gimbal_Circuit_Boards）和云台（Circuit_Boards!=Chassis_Circuit_Boards）的控制逻辑。
 * @author WeiFan Qiu (qiuweifan0523@faxmail.com)
 * @version 1.0
 * @date 2025-08-07
 * 
 * @copyright Copyright (c) 2025 邱伟凡
 * 
 * @par 修改日志:
 * - 2025-08-07: 初始版本，实现遥控器数据转换及模式映射功能
 * 
 * @bug 待解决问题: 暂无已知问题
 */
#include "QWF_Ctrl.h"
/**
 * @brief 遥控器输入处理核心函数（统一处理多类型遥控器输入并映射控制指令）
 * @details 主流程：
 *          1. 根据控制模式（RC/摇杆或KM/键鼠）选择数据转换逻辑；
 *          2. 将VT13/DT7遥控器原始数据转换为统一的RC/KM结构体；
 *          3. 根据遥控器开关/按键状态设置底盘、云台、发射机构的工作模式；
 *          4. 保留历史数据用于状态变化检测（如按键按下/释放）。
 */ 
// 系统复位函数（当前注释未使用，保留备用）
//void System_Reset(void)
//{
//	__set_FAULTMASK(1);       // 关闭所有中断
//  NVIC_SystemReset();       // 触发系统复位
//}

void QWF_Ctrl_Func(void){//遥控器控制代码
	switch((int)ctrl->mode){
		case RC:{  // 摇杆控制模式（Remote Control）
			switch((int)ctrl->type){	// 根据遥控器类型（VT13/DT7）转换数据
/*---------------------数据转化（将不同遥控器原始数据映射为统一RC结构体）-------------------------*/				
				case VT13:{  // VT13遥控器数据转换
						/*将VT13原始摇杆通道映射为通用RC结构体（ch[0-3]对应左/右/前/后等方向）*/
					ctrl->RC[now].ch[0]=ctrl->VT13[now]->rc.ch[0];  // 通道0（右边前后）
					ctrl->RC[now].ch[1]=ctrl->VT13[now]->rc.ch[1];  // 通道1（右边左右）
					ctrl->RC[now].ch[2]=ctrl->VT13[now]->rc.ch[3];  // 通道2（左边前后)
					ctrl->RC[now].ch[3]=ctrl->VT13[now]->rc.ch[2];  // 通道3（左边左右）
					// 开关S0状态映射（模式切换）
					ctrl->RC[now].s[0]=	ctrl->VT13[now]->rc.mode_sw==1?3:  // 原始开关1→S0=3
										ctrl->VT13[now]->rc.mode_sw==2?2:  // 原始开关2→S0=2
										1;  // 其他→S0=1
					// 滚轮状态映射（S1开关）
					ctrl->RC[now].s[1]=	ctrl->VT13[now]->rc.wheel>=330?1:  // 滚轮右偏→S1=1
										ctrl->VT13[now]->rc.wheel<=-330?2:  // 滚轮左偏→S1=2
										3;  // 中间→S1=3
					ctrl->VT13[last]=ctrl->VT13[now];  // 保存历史数据用于状态变化检测
				}break;
				case(DT7):{  // DT7遥控器数据转换（逻辑同VT13，直接映射通道和开关）
					ctrl->RC[now].ch[0]=ctrl->DT7[now]->rc.ch[0];  // 通道0（右边前后）
					ctrl->RC[now].ch[1]=ctrl->DT7[now]->rc.ch[1];  // 通道1（右边左右）
					ctrl->RC[now].ch[2]=ctrl->DT7[now]->rc.ch[3];  // 通道2（左边前后)
					ctrl->RC[now].ch[3]=ctrl->DT7[now]->rc.ch[2];  // 通道3（左边左右）
					ctrl->RC[now].s[0]=ctrl->DT7[now]->rc.s[0];  // 直接使用DT7的S0开关状态
					ctrl->RC[now].s[1]=ctrl->DT7[now]->rc.s[1];  // 直接使用DT7的S1开关状态
					ctrl->DT7[last]=ctrl->DT7[now];  // 保存历史数据
				}break;
			}
/*---------------------数据应用（根据RC开关状态设置执行机构模式）-------------------------*/			
			switch(ctrl->RC[now].s[0]){  // 根据S0开关状态分支
			#if Circuit_Boards!=Head_Circuit_Boards  // 非云台电路板（底盘控制）
				case 1:switch(ctrl->RC[now].s[1]){  // S0=1时，根据S1设置底盘模式
					case 1:chassis->mode[now]=chassis_top;break;  // S1=1→底盘顶置模式
					case 3:chassis->mode[now]=chassis_follow;break;  // S1=3→底盘跟随模式
					case 2:chassis->mode[now]=chassis_stop;break;  // S1=2→底盘停止模式
				};break;
			#endif
			#if Circuit_Boards!=Chassis_Circuit_Boards  // 非底盘电路板（云台/发射控制）
				case 3:switch(ctrl->RC[now].s[1]){  // S0=3时，根据S1设置云台模式
					case 1:gimbal_mode[now]=gimbal_vision;break;  // S1=1→云台视觉模式
					case 3:gimbal_mode[now]=gimbal_normal;break;  // S1=3→云台常规模式
					case 2:gimbal_mode[now]=gimbal_stop;break;  // S1=2→云台停止模式
				};break; 
				case 2:switch(ctrl->RC[now].s[1]){  // S0=2时，根据S1设置发射模式
					case 1:shoot_mode[now]=fire_continuous;break;  // S1=1→连续发射
					case 3:shoot_mode[now]=fire_knob_stop;break;  // S1=3→旋钮停止发射
					case 2:shoot_mode[now]=fire_stop;break;  // S1=2→停止发射
				};break;
			#endif
			}
			ctrl->RC[last]=ctrl->RC[now];  // 保存当前RC状态为历史数据
		}break;
		case (KM):{	// 键鼠控制模式（Keyboard & Mouse）
			switch((int)ctrl->type){  // 根据遥控器类型（VT13/DT7）转换数据
/*---------------------数据转化（将键鼠原始数据映射为统一KM结构体）-------------------------*/			
				case VT13:{  // VT13遥控器的键鼠数据转换
					ctrl->KM[now].mouse.x=ctrl->VT13[now]->mouse.x ;  // 鼠标X坐标
					ctrl->KM[now].mouse.y=ctrl->VT13[now]->mouse.y ;  // 鼠标Y坐标
					ctrl->KM[now].mouse.z=ctrl->VT13[now]->mouse.z ;  // 鼠标滚轮
					ctrl->KM[now].mouse.press_l=ctrl->VT13[now]->mouse.press_l ;  // 左键按下状态
					ctrl->KM[now].mouse.press_r=ctrl->VT13[now]->mouse.press_r ;  // 右键按下状态
					ctrl->KM[now].key=ctrl->VT13[now]->key;  // 键盘按键状态
					ctrl->VT13[last]=ctrl->VT13[now];  // 保存历史数据
				}break;
				case (DT7):{  // DT7遥控器的键鼠数据转换（逻辑同VT13）
					ctrl->KM[now].mouse.x=ctrl->DT7[now]->mouse.x ;  // 鼠标X坐标
					ctrl->KM[now].mouse.y=ctrl->DT7[now]->mouse.y ;  // 鼠标Y坐标
					ctrl->KM[now].mouse.z=ctrl->DT7[now]->mouse.z ;  // 鼠标滚轮
					ctrl->KM[now].mouse.press_l=ctrl->DT7[now]->mouse.press_l ;  // 左键按下状态
					ctrl->KM[now].mouse.press_r=ctrl->DT7[now]->mouse.press_r ;  // 右键按下状态
					ctrl->KM[now].key=ctrl->DT7[now]->key;  // 键盘按键状态
					ctrl->DT7[last]=ctrl->DT7[now];  // 保存历史数据
				}break;
			}
/*---------------------数据应用（根据键鼠按键/鼠标状态设置执行机构模式）-------------------------*/			
			#if Circuit_Boards!=Head_Circuit_Boards	// 底盘控制逻辑（非云台电路板）
			if(ctrl->KM[now].key.q==0&&ctrl->KM[last].key.q==1){  // Q键释放时切换底盘模式
				if(chassis->mode[now]!=chassis_follow){  // 当前非跟随模式→切换为跟随
					chassis->mode[now]=chassis_follow;
				}
				else {  // 当前是跟随模式→切换为小陀螺
					chassis->mode[now]=chassis_top;
				}
			}
			else if(ctrl->KM[now].key.q==1&&ctrl->KM[last].key.q==1){// 按住Q键时切换小陀螺模式（动态调整转速）
				if(chassis->sys.top.use_top_change)  // 启用动态变化标志时，转速叠加正弦波（模拟波动）
					chassis->sys.top.w=chassis->sys.top.w_now+2000*arm_sin_f32(HAL_GetTick()/1000.0f);
				if(ctrl->KM[now].key.v==1&&ctrl->KM[last].key.v==0){  // V键按下→降低基础转速
					chassis->sys.top.w_now-=500;
					chassis->sys.top.w=chassis->sys.top.w_now;
					chassis->sys.top.use_top_change=0;  // 关闭动态变化
				}
				else if(ctrl->KM[now].key.b==1&&ctrl->KM[last].key.b==0){  // B键按下→提高基础转速
					chassis->sys.top.w_now+=500;
					chassis->sys.top.w=chassis->sys.top.w_now;
					chassis->sys.top.use_top_change=0;  // 关闭动态变化
				}
				else if(ctrl->KM[now].key.c==1&&ctrl->KM[last].key.c==1){// 同时按住Q和C→启用动态变化
					chassis->sys.top.use_top_change=1;
				}
			}
			else if(ctrl->KM[last].key.ctrl==0&&ctrl->KM[now].key.ctrl==1){// Ctrl键按下→极刹/恢复跟随
				if(chassis->mode[now]!=chassis_stop)  // 当前非停止→停止
					chassis->mode[now]=chassis_stop;
				else  // 当前停止→恢复跟随
					chassis->mode[now]=chassis_follow;
			}
			else if(ctrl->KM[last].key.shift==0&&ctrl->KM[now].key.shift==1){// Shift键按下→切换超点使用状态
				super_elec->use=!super_elec->use;
			}
			#endif
			#if Circuit_Boards!=Chassis_Circuit_Boards	// 云台/发射控制逻辑（非底盘电路板）
			// 视觉建议开关（F键切换）
			if(ctrl->KM[now].key.f==1&&ctrl->KM[last].key.f==0)
				vision->rx.use_fire_advice=!vision->rx.use_fire_advice;
			// 鼠标右键→视觉模式（按住右键保持视觉模式）
			if(ctrl->KM[now].mouse.press_r==1&&ctrl->KM[now].mouse.press_r==1){
					gimbal_mode[now]=gimbal_vision;
			}
				else
					gimbal_mode[now]=gimbal_normal;
			// 视觉模式切换（R键点击）
			if(ctrl->KM[now].key.r==1&&ctrl->KM[last].key.r==0){
				if(vision_mode==vision_mode_car)  // 当前车辆模式→切换小符模式
					vision_mode=vision_mode_small_flag;
				else if(vision_mode==vision_mode_small_flag)  // 当前小符模式→切换大符模式
					vision_mode=vision_mode_big_flag;
				else  // 当前大符模式→切换车辆模式
					vision_mode=vision_mode_car;	
			}	
			// 发射模式切换（E键点击/按住）
			if(ctrl->KM[now].key.e==1&&ctrl->KM[last].key.e==0){// E键点击→连续/单次切换
				if(shoot_mode[now]==fire_continuous)
					shoot_mode[now]=fire_once;
				else
					shoot_mode[now]=fire_continuous;	
			}
			else if(ctrl->KM[now].key.e==1&&ctrl->KM[last].key.e==1){// E键按住→调整摩擦轮转速
				if(ctrl->KM[now].key.v==1&&ctrl->KM[last].key.v==0){  // V键按下→降低最大转速
					head->part.shoot.fire.ramp.max-=fire_diff;
					head->part.shoot.fire.speed_loop.use=0;  // 关闭弹速闭环
				}
				else if(ctrl->KM[now].key.b==1&&ctrl->KM[last].key.b==0){  // B键按下→提高最大转速
					head->part.shoot.fire.ramp.max+=fire_diff;
					head->part.shoot.fire.speed_loop.use=0;  // 关闭弹速闭环
				}
				else if(ctrl->KM[now].key.c==1&&ctrl->KM[last].key.c==1){// 同时按住E和C→启用弹速闭环
					head->part.shoot.fire.speed_loop.use=1;
				}
				if(ctrl->KM[now].key.x==1&&ctrl->KM[last].key.x==1){// X键按住→关闭热量闭环
					head->part.shoot.knob.heat_loop.use=0;
				}
				else if(ctrl->KM[now].key.z==1&&ctrl->KM[last].key.z==1){// Z键按住→开启热量闭环
					head->part.shoot.knob.heat_loop.use=1;
				}
			}
			// 鼠标左键→触发发射（视觉模式下根据识别结果决定）
			if(ctrl->KM[now].mouse.press_l==1){
				if(gimbal_mode[now]==gimbal_vision){  // 当前视觉模式
					if(vision_mode==vision_mode_small_flag||vision_mode==vision_mode_big_flag){// 打符模式必用火控
						if(vision_fire_flag)  // 火控说发射→单次发射
							shoot_mode[now]=fire_once;
						else  // 火控不发射→旋钮停止
							shoot_mode[now]=fire_knob_stop;
					}
				}
			}
			#endif		
			ctrl->KM[last]=ctrl->KM[now];  // 保存当前数据为历史数据
		}break;
	}
}
